package cn.bearspark.api.controller.main;

import cn.bearspark.api.service.main.ArticleService;
import cn.bearspark.api.vo.main.article.*;
import cn.bearspark.framework.web.starter.limit.RequestLimit;
import cn.bearspark.framework.web.starter.vo.ResponseVO;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 专栏模块 TODO 专栏的总数需要存储起来，最好放到专栏模块
 *
 * @author f
 */
@Validated
@RestController
@RequestMapping("/article")
public class ArticleController {

    private final ArticleService articleService;

    public ArticleController(ArticleService articleService) {
        this.articleService = articleService;
    }

    /**
     * 发布专栏
     *
     * @param publishArticleVO 发布专栏的请求对象
     * @return 响应对象
     */
    @PostMapping
    public ResponseVO<Object> publish(@Valid @RequestBody PublishArticleVO publishArticleVO) {
        articleService.publish(publishArticleVO);
        return ResponseVO.success();
    }

    /**
     * 获取专栏信息
     * <p>
     * 限制 1s 内，一个用户只能访问 100 次
     *
     * @param articleId 待获取信息的专栏 id
     * @return 专栏信息
     */
    @GetMapping("/{articleId}")
    @RequestLimit(limit = 100, second = 1)
    public ResponseVO<Article4ModifyVO> get(@PathVariable Long articleId) {
        return ResponseVO.success(articleService.get(articleId));
    }

    /**
     * 修改专栏
     *
     * @param modifyArticleVO 修改专栏的请求对象
     * @return 响应对象
     */
    @PutMapping
    public ResponseVO<Object> modify(@Valid @RequestBody ModifyArticleVO modifyArticleVO) {
        articleService.modify(modifyArticleVO);
        return ResponseVO.success();
    }

    /**
     * 删除专栏
     *
     * @param articleId 待删除的专栏 id
     * @return 响应对象
     */
    @DeleteMapping("/{articleId}")
    public ResponseVO<Object> delete(@PathVariable Long articleId) {
        articleService.delete(articleId);
        return ResponseVO.success();
    }

    /**
     * 获取专栏详情 TODO 增加标签和专栏的浏览量
     * <p>
     * 限制 1s 内，一个用户只能访问 100 次
     *
     * @param articleId 待获取详情的专栏 id
     * @return 专栏详情
     */
    @GetMapping("/detail/{articleId}")
    @RequestLimit(limit = 100, second = 1)
    public ResponseVO<ArticleDetailVO> detail(@PathVariable Long articleId) {
        return ResponseVO.success(articleService.detail(articleId));
    }

    /**
     * 分页查询指定分类的专栏
     * <p>
     * 限制 1s 内，一个用户只能访问 100 次
     *
     * @param pageNum      页数
     * @param pageSize     元素数
     * @param categoryId   指定的分类 id，如果为 null，表示查询所有专栏
     * @param listedUserId 待分页查询专栏的用户 id
     * @return 如果分类 id 为 null，则返回用户全部专栏的分页查询集合；如果分类 id 不为 null，则返回用户指定分类下的专栏的分页查询集合
     */
    @GetMapping("/{pageNum}/{pageSize}")
    @RequestLimit(limit = 100, second = 1)
    public ResponseVO<List<ArticleSimpleVO>> page(@PathVariable Integer pageNum,
                                                  @PathVariable Integer pageSize,
                                                  Long categoryId,
                                                  @NotNull Long listedUserId) {
        return ResponseVO.success(articleService.page(pageNum, pageSize, categoryId, listedUserId));
    }

}
